/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.daos.Relatorio;

import Persistencia.ConnectionFactory;
import Persistencia.daos.GolsDAO;
import Persistencia.daos.TimeDAO;
import Persistencia.modelos.Gols;
import Persistencia.modelos.Relatorios.GolsPartida;
import Persistencia.modelos.Relatorios.Relatorio;
import Persistencia.modelos.Time;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

/**
 *
 * @author HP
 */
public class RelatorioDAO {

    public Relatorio recuperaClassificacaoPorCampeonato() {
        Map<Integer, GolsPartida> partida = new HashMap<Integer, GolsPartida>();
        Collection<Gols> gols = new GolsDAO().recuperaTodos();
        for (Gols gol : gols) {
            GolsPartida golsPartida;
            if ((golsPartida = (partida.get(gol.getNroPartida()))) == null) {
                golsPartida = new GolsPartida();
                partida.put(gol.getNroPartida(), golsPartida);
            }
            golsPartida.setTimeMandante(gol.getPartida().getTimeMandante().getNomeTime());
            golsPartida.setTimeVisitante(gol.getPartida().getTimeVisitante().getNomeTime());
            if (gol.getTime().getNomeTime().equals(golsPartida.getTimeVisitante())) {
                golsPartida.setGolsVisitantes();
            } else if (gol.getTime().getNomeTime().equals(golsPartida.getTimeVisitante())) {
                golsPartida.setGolsMandante();
            }
        }
        Collection<GolsPartida> values = ((HashMap<Integer, GolsPartida>) partida).values();
        Map<String, Integer> pontoPorTime = new HashMap<String, Integer>();
        for (GolsPartida golsPartida : values) {
            int pontosMandante = (pontoPorTime.get(golsPartida.getTimeMandante())==null)?0:pontoPorTime.get(golsPartida.getTimeMandante());
            int pontosVisitante = (pontoPorTime.get(golsPartida.getTimeVisitante())==null)?0:pontoPorTime.get(golsPartida.getTimeVisitante());
            pontoPorTime.put(golsPartida.getTimeMandante(), pontosMandante += golsPartida.pontosTimeMandante());
            pontoPorTime.put(golsPartida.getTimeVisitante(), pontosVisitante += golsPartida.pontosTimeVisitante());
        }

        Collection<Time> times = new TreeSet(new TimeDAO().recuperaTodos());
        for (Time time : times) {
            if (pontoPorTime.get(time.getNomeTime()) == null) {
                pontoPorTime.put(time.getNomeTime(), 0);
            }
        }        
        sortByValue(pontoPorTime);
        
        Relatorio r = new Relatorio();
        r.getTitulos().add("time");
        r.getTitulos().add("Pontos");
        for (String string: pontoPorTime.keySet()){
            List<String> list = new ArrayList<String>();
            list.add(string);
            list.add(String.valueOf(pontoPorTime.get(string)));
            r.getValores().add(list);
        }
        return r;
    }

    public Relatorio recuperaGolsPorJogadorCampeonato() {
        try {
            String sql = "  select count(g.idgols), a.nomepessoa, t.nometime "
                    + " from Partida p, gols g, Campeonato c, Jogador j, Pessoa a, Time t "
                    + " where p.nropartida = g.nropartida "
                    + " and p.idcampeonato = c.idcampeonato "
                    + " and g.idjogador = j.idpessoa "
                    + " and a.idpessoa = j.idpessoa "
                    + "  and g.idtime = t.idtime "
                    + " group by g.idtime, a.nomepessoa, t.nometime "
                    + " order by 1 desc";
            Connection connection = ConnectionFactory.getConnection();
            Statement createStatement = connection.createStatement();
            ResultSet rs = createStatement.executeQuery(sql);
            Relatorio relatorio = new Relatorio();
            relatorio.getTitulos().add("Gols");
            relatorio.getTitulos().add("Jogador");
            relatorio.getTitulos().add("Campeonato");
            while (rs.next()) {
                List<String> valor = new ArrayList<String>();
                valor.add(String.valueOf(rs.getInt("idgols")));
                valor.add(rs.getString("nomeTime"));
                valor.add(rs.getString("nomecampeonato"));
                relatorio.getValores().add(valor);
            }
            createStatement.close();
            connection.close();
            return relatorio;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

    public Relatorio recuperaGolsPorTimeCampeonato() {
        try {
            String sql = "select count(g.idgols) idgols, t.nometime nometime, c.nomecampeonato nomecampeonato "
                    + " from Partida p, gols g, Campeonato c, Time t"
                    + " where p.nropartida = g.nropartida "
                    + " and p.idcampeonato = c.idcampeonato "
                    + " and t.idtime = g.idtime "
                    + " group by t.nometime, c.nomeCampeonato";
            Connection connection = ConnectionFactory.getConnection();
            Statement createStatement = connection.createStatement();
            ResultSet rs = createStatement.executeQuery(sql);
            Relatorio relatorio = new Relatorio();
            relatorio.getTitulos().add("Gols");
            relatorio.getTitulos().add("Time");
            relatorio.getTitulos().add("Campeonato");
            while (rs.next()) {
                List<String> valor = new ArrayList<String>();
                valor.add(String.valueOf(rs.getInt("idgols")));
                valor.add(rs.getString("nometime"));
                valor.add(rs.getString("nomecampeonato"));
                relatorio.getValores().add(valor);
            }
            createStatement.close();
            connection.close();
            return relatorio;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

    public Relatorio recuperaResultadosDasPartidas() {
        try {
            String sql = "  select count(g.idgols) idgols, t.nometime nomeTime, p.nropartida Partida,p.datapartida Data,p.qtdetorcedores Qtde_torcedores,e.nomeestadio Estadio"
                    + " from Partida p, Time t, Gols g, Campeonato c, Estadio e "
                    + "  where c.idcampeonato = p.idcampeonato "
                    + "    and p.nropartida = g.nropartida "
                    + "    and t.idtime = g.idtime "
                    + "    and e.idestadio = p.idestadio "
                    + "  group by t.nometime, p.nropartida,p.datapartida,p.qtdetorcedores,e.nomeestadio "
                    + "  order by 3;";
            Connection connection = ConnectionFactory.getConnection();
            Statement createStatement = connection.createStatement();
            ResultSet rs = createStatement.executeQuery(sql);
            Relatorio relatorio = new Relatorio();
            relatorio.getTitulos().add("Gols");
            relatorio.getTitulos().add("Jogador");
            relatorio.getTitulos().add("Partida");
            relatorio.getTitulos().add("Data");
            relatorio.getTitulos().add("Qtde_torcedores");
            relatorio.getTitulos().add("Estadio");
            while (rs.next()) {
                List<String> valor = new ArrayList<String>();
                valor.add(String.valueOf(rs.getInt("idgols")));
                valor.add(rs.getString("nomeTime"));
                valor.add(String.valueOf(rs.getInt("Partida")));
                valor.add(new SimpleDateFormat("dd/MM/yyyy").format(rs.getDate("Data")));
                valor.add(String.valueOf(rs.getInt("Qtde_torcedores")));
                valor.add(rs.getString("Estadio"));
                relatorio.getValores().add(valor);
            }
            createStatement.close();
            connection.close();
            return relatorio;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

    static Map sortByValue(Map map) {
        List list = new LinkedList(map.entrySet());
        Collections.sort(list, new Comparator() {

            public int compare(Object o1, Object o2) {
                return ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue());
            }
        });

        Map result = new LinkedHashMap();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry) it.next();
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }

    public Relatorio recuperaQuantidadeDeCartoes() {
        try {
            String sql = "select SUM(a.qtdecartao) Qtde,p.nomepessoa Nome"
                    + "from possuicartao a, "
                    + "     Cartao c, "
                    + "     Jogador j, "
                    + "     Pessoa p "
                    + "where a.idcartao = c.idcartao "
                    + "and   a.idpessoa = j.idpessoa "
                    + "and   p.idpessoa = j.idpessoa "
                    + "group by p.nomepessoa";
            Connection connection = ConnectionFactory.getConnection();
            Statement createStatement = connection.createStatement();
            ResultSet rs = createStatement.executeQuery(sql);
            Relatorio relatorio = new Relatorio();
            relatorio.getTitulos().add("Qtde");
            relatorio.getTitulos().add("Nome");
            while (rs.next()) {
                List<String> valor = new ArrayList<String>();
                valor.add(String.valueOf(rs.getInt("Qtde")));
                valor.add(rs.getString("Nome"));
                relatorio.getValores().add(valor);
            }
            createStatement.close();
            connection.close();
            return relatorio;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }
}
